home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / code39.arc / CODE39.BAS next >
BASIC Source File  |  1986-09-16  |  13KB  |  268 lines

  1. 10  '**************************************************************************
  2. 20  '*****                 CODE 3-of-9 BAR CODE  GENERATOR                *****
  3. 30  '*****                 *******************************                *****
  4. 40  '*****      This program will generate standard 3-of-9 bar code       *****
  5. 50  '*****      on any dot matrix printer which is compatable with        *****
  6. 60  '*****      an Epson or IBM graphics printer.                         *****
  7. 70  '*****                 ******************************                 *****
  8. 80  '*****                      -  SPECIFICATIONS -                       *****
  9. 90  '**                                                                      **
  10. 100 '**                         W                                 N          **
  11. 110 '**                |  Nominal Width  | Nominal Width  | Nominal Ratio    **
  12. 120 '**     Density    |       of        |      of        |      of          **
  13. 130 '**   (Characters/ | Narrow Bars and | Wide Bars and  | Wide to Narrow   **
  14. 140 '**      Inch)     | Spaces (Inches) | Spaces (Inches)| Element Width    **
  15. 150 '**   -------------+-----------------+----------------+----------------  **
  16. 160 '**      5.730     |     0.0125      |     0.0315     |      2.52        **
  17. 170 '**   -------------+-----------------+----------------+----------------  **
  18. 180 '**                                                                      **
  19. 190 '*****                 ******************************                 *****
  20. 200 '*****  Code 3-of-9 was developed in 1974 by Dr. David C. Allais of   *****
  21. 210 '*****  Interface Mechanisms, Inc.  It has been adopted as the        *****
  22. 220 '*****  standard bar code symbology of the Department of Defence      *****
  23. 230 '*****  (MIL-STD-1189) and is the most widely used alphanumeric bar   *****
  24. 240 '*****  code in use.  Code 3-of-9 is so called because the original   *****
  25. 250 '*****  concept provided for 39 data characters.  The name also       *****
  26. 260 '*****  describes the structure of the code which has 3 wide elements *****
  27. 270 '*****  out of a total of 9.                                          *****
  28. 280 '*****                                                                *****
  29. 290 '*****  For best results use only even numbered values for height     *****
  30. 300 '*****  and use a height which is approx 15% of the total code        *****
  31. 310 '*****  length.                                                       *****
  32. 320 '*****                                                                *****
  33. 330 '*****  This program was written solely for information purposes to   *****
  34. 340 '*****  demonstrate the structure of code 3-of-9.  The author is      *****
  35. 350 '*****  not responsible for any damages incurred through the use of   *****
  36. 360 '*****  this program.                                                 *****
  37. 370 '*****                                                                *****
  38. 380 '*****                           Bill Wood  Milwaukee, WI   05/18/85  *****
  39. 390 '**************************************************************************
  40. 400 '
  41. 410  DIM X(30),M(30),P$(30),A$(30)
  42. 420  '
  43. 430  '*****  generate data entry screen
  44. 440  '
  45. 450  KEY OFF
  46. 460  CLS
  47. 470  COLOR 7
  48. 480  PRINT "╔═════════════════════════════════════╗"
  49. 490  FOR P=1 TO 3
  50. 500  PRINT "║                                     ║"
  51. 510  NEXT P
  52. 520  PRINT "╠═════════════════════════════════════╣
  53. 530  FOR P=1 TO 5
  54. 540  PRINT "║                                     ║"
  55. 550  NEXT P
  56. 560  PRINT "╚═════════════════════════════════════╝"
  57. 570  '
  58. 580  '*****  display menu and get input from user
  59. 590  '
  60. 600  LOCATE 3,5  :COLOR 4 :PRINT "CODE 3-OF-9 BAR CODE GENERATOR"
  61. 610  LOCATE 6,3  :COLOR 6 :PRINT "1  Print Data from CONSOLE"
  62. 620  LOCATE 7,3  :COLOR 6 :PRINT "2  Print Data from FILE   "
  63. 630  LOCATE 8,3  :COLOR 6 :PRINT "3  ADD Data to FILE  "
  64. 640  LOCATE 9,3  :COLOR 6 :PRINT "Q  QUIT              "
  65. 650  LOCATE 10,10:COLOR 6 :PRINT "==>"
  66. 660  LOCATE 10,14:COLOR 10:INPUT " ",SELECT$
  67. 670  IF SELECT$="Q" THEN GOTO 1940
  68. 680  GOSUB 2260
  69. 690  IF SELECT$="1" THEN GOTO 730
  70. 700  IF SELECT$="2" THEN GOTO 740
  71. 710  IF SELECT$="3" THEN GOTO 750
  72. 720  GOTO 450
  73. 730  GOSUB 1990 :GOSUB 790 :GOTO 450
  74. 740  OPEN "CODE39.DAT" FOR INPUT  AS #1 :GOTO 2070
  75. 750  OPEN "CODE39.DAT" FOR APPEND AS #1 :GOTO 2170
  76. 760  '
  77. 770  '*****  add start and stop characters to user message (*)
  78. 780  '
  79. 790  MSG$="*"+MSG$+"*" :S$=""
  80. 800  '
  81. 810  '*****  define print head pins to fire
  82. 820  '
  83. 830   NS$=CHR$(0)+CHR$(0)
  84. 840   WS$=CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
  85. 850   NB$=CHR$(255)
  86. 860   WB$=CHR$(255)+CHR$(255)+CHR$(255)
  87. 870 '
  88. 880 '*****  CHECK FOR ONLY CAPITAL LETTERS
  89. 890 '
  90. 900 GOSUB 2320
  91. 910  '
  92. 920  '*****  decode message into bar code
  93. 930  '
  94. 940  L=LEN(MSG$)
  95. 950  FOR X=1 TO L
  96. 960  TEST$=MID$(MSG$,X,1)
  97. 970  IF TEST$="1" THEN L$=WB$+NS$+NB$+WS$+NB$+NS$+NB$+NS$+WB$ :GOTO 1470
  98. 980  IF TEST$="2" THEN L$=NB$+NS$+WB$+WS$+NB$+NS$+NB$+NS$+WB$ :GOTO 1470
  99. 990  IF TEST$="3" THEN L$=WB$+NS$+WB$+WS$+NB$+NS$+NB$+NS$+NB$ :GOTO 1470
  100. 1000  IF TEST$="4" THEN L$=NB$+NS$+NB$+WS$+WB$+NS$+NB$+NS$+WB$ :GOTO 1470
  101. 1010  IF TEST$="5" THEN L$=WB$+NS$+NB$+WS$+WB$+NS$+NB$+NS$+NB$ :GOTO 1470
  102. 1020  IF TEST$="6" THEN L$=NB$+NS$+WB$+WS$+WB$+NS$+NB$+NS$+NB$ :GOTO 1470
  103. 1030  IF TEST$="7" THEN L$=NB$+NS$+NB$+WS$+NB$+NS$+WB$+NS$+WB$ :GOTO 1470
  104. 1040  IF TEST$="8" THEN L$=WB$+NS$+NB$+WS$+NB$+NS$+WB$+NS$+NB$ :GOTO 1470
  105. 1050  IF TEST$="9" THEN L$=NB$+NS$+WB$+WS$+NB$+NS$+WB$+NS$+NB$ :GOTO 1470
  106. 1060  IF TEST$="0" THEN L$=NB$+NS$+NB$+WS$+WB$+NS$+WB$+NS$+NB$ :GOTO 1470
  107. 1070  IF TEST$="A" THEN L$=WB$+NS$+NB$+NS$+NB$+WS$+NB$+NS$+WB$ :GOTO 1470
  108. 1080  IF TEST$="B" THEN L$=NB$+NS$+WB$+NS$+NB$+WS$+NB$+NS$+WB$ :GOTO 1470
  109. 1090  IF TEST$="C" THEN L$=WB$+NS$+WB$+NS$+NB$+WS$+NB$+NS$+NB$ :GOTO 1470
  110. 1100  IF TEST$="D" THEN L$=NB$+NS$+NB$+NS$+WB$+WS$+NB$+NS$+WB$ :GOTO 1470
  111. 1110  IF TEST$="E" THEN L$=WB$+NS$+NB$+NS$+WB$+WS$+NB$+NS$+NB$ :GOTO 1470
  112. 1120  IF TEST$="F" THEN L$=NB$+NS$+WB$+NS$+WB$+WS$+NB$+NS$+NB$ :GOTO 1470
  113. 1130  IF TEST$="G" THEN L$=NB$+NS$+NB$+NS$+NB$+WS$+WB$+NS$+WB$ :GOTO 1470
  114. 1140  IF TEST$="H" THEN L$=WB$+NS$+NB$+NS$+NB$+WS$+WB$+NS$+NB$ :GOTO 1470
  115. 1150  IF TEST$="I" THEN L$=NB$+NS$+WB$+NS$+NB$+WS$+WB$+NS$+NB$ :GOTO 1470
  116. 1160  IF TEST$="J" THEN L$=NB$+NS$+NB$+NS$+WB$+WS$+WB$+NS$+NB$ :GOTO 1470
  117. 1170  IF TEST$="K" THEN L$=WB$+NS$+NB$+NS$+NB$+NS$+NB$+WS$+WB$ :GOTO 1470
  118. 1180  IF TEST$="L" THEN L$=NB$+NS$+WB$+NS$+NB$+NS$+NB$+WS$+WB$ :GOTO 1470
  119. 1190  IF TEST$="M" THEN L$=WB$+NS$+WB$+NS$+NB$+NS$+NB$+WS$+NB$ :GOTO 1470
  120. 1200  IF TEST$="N" THEN L$=NB$+NS$+NB$+NS$+WB$+NS$+NB$+WS$+WB$ :GOTO 1470
  121. 1210  IF TEST$="O" THEN L$=WB$+NS$+NB$+NS$+WB$+NS$+NB$+WS$+NB$ :GOTO 1470
  122. 1220  IF TEST$="P" THEN L$=NB$+NS$+WB$+NS$+WB$+NS$+NB$+WS$+NB$ :GOTO 1470
  123. 1230  IF TEST$="Q" THEN L$=NB$+NS$+NB$+NS$+NB$+NS$+WB$+WS$+WB$ :GOTO 1470
  124. 1240  IF TEST$="R" THEN L$=WB$+NS$+NB$+NS$+NB$+NS$+WB$+WS$+NB$ :GOTO 1470
  125. 1250  IF TEST$="S" THEN L$=NB$+NS$+WB$+NS$+NB$+NS$+WB$+WS$+NB$ :GOTO 1470
  126. 1260  IF TEST$="T" THEN L$=NB$+NS$+NB$+NS$+WB$+NS$+WB$+WS$+NB$ :GOTO 1470
  127. 1270  IF TEST$="U" THEN L$=WB$+WS$+NB$+NS$+NB$+NS$+NB$+NS$+WB$ :GOTO 1470
  128. 1280  IF TEST$="V" THEN L$=NB$+WS$+WB$+NS$+NB$+NS$+NB$+NS$+WB$ :GOTO 1470
  129. 1290  IF TEST$="W" THEN L$=WB$+WS$+WB$+NS$+NB$+NS$+NB$+NS$+NB$ :GOTO 1470
  130. 1300  IF TEST$="X" THEN L$=NB$+WS$+NB$+NS$+WB$+NS$+NB$+NS$+WB$ :GOTO 1470
  131. 1310  IF TEST$="Y" THEN L$=WB$+WS$+NB$+NS$+WB$+NS$+NB$+NS$+NB$ :GOTO 1470
  132. 1320  IF TEST$="Z" THEN L$=NB$+WS$+WB$+NS$+WB$+NS$+NB$+NS$+NB$ :GOTO 1470
  133. 1330  IF TEST$="-" THEN L$=NB$+WS$+NB$+NS$+NB$+NS$+WB$+NS$+WB$ :GOTO 1470
  134. 1340  IF TEST$="." THEN L$=WB$+WS$+NB$+NS$+NB$+NS$+WB$+NS$+NB$ :GOTO 1470
  135. 1350  IF TEST$=" " THEN L$=NB$+WS$+WB$+NS$+NB$+NS$+WB$+NS$+NB$ :GOTO 1470
  136. 1360  IF TEST$="*" THEN L$=NB$+WS$+NB$+NS$+WB$+NS$+WB$+NS$+NB$ :GOTO 1470
  137. 1370  IF TEST$="$" THEN L$=NB$+WS$+NB$+WS$+NB$+WS$+NB$+NS$+NB$ :GOTO 1470
  138. 1380  IF TEST$="/" THEN L$=NB$+WS$+NB$+WS$+NB$+NS$+NB$+WS$+NB$ :GOTO 1470
  139. 1390  IF TEST$="+" THEN L$=NB$+WS$+NB$+NS$+NB$+WS$+NB$+WS$+NB$ :GOTO 1470
  140. 1400  IF TEST$="%" THEN L$=NB$+NS$+NB$+WS$+NB$+WS$+NB$+WS$+NB$ :GOTO 1470
  141. 1410  '
  142. 1420  '*****  print error message if input is invalid
  143. 1430  '
  144. 1440  LOCATE 7,3  :COLOR 11 :PRINT "   INVALID CHARACTER DETECTED!!!    "
  145. 1450  LOCATE 9,3  :COLOR 28 :PRINT "                ";TEST$;"      "
  146. 1460  LOCATE 15,8 :COLOR 14 :PRINT "*** PROCESSING ABORTED ***":GOTO 1940
  147. 1470  P$(X)=L$
  148. 1480  '
  149. 1490  '*****  develop human readable text to be printed under bar code
  150. 1500  '
  151. 1510   A$(X)=TEST$
  152. 1520   IF X=15 OR X=25 THEN GOTO 1540
  153. 1530   IF X>2 AND (X MOD 2)>0 THEN S$=S$+" "
  154. 1540  NEXT X
  155. 1550  '
  156. 1560  '*****  set printer to 2/216 lines per inch
  157. 1570  '
  158. 1580  WIDTH "LPT1:",255
  159. 1590  LPRINT CHR$(27);CHR$(51);CHR$(2);
  160. 1600  '
  161. 1610  '*****  calculate N1 and N2 values for dot graphics command
  162. 1620  '
  163. 1630  COLS=21
  164. 1640  N1=COLS MOD 256
  165. 1650  N2=FIX(COLS/256)
  166. 1660  '
  167. 1670  '*****  print each character of bar code
  168. 1680  '
  169. 1690  LOCATE 7,3 :COLOR 1 :PRINT "PRINTING-                           "
  170. 1700  HIGH=ABS(HIGH):IF HIGH=0 THEN HIGH=2
  171. 1710  FOR H=1 TO HIGH
  172. 1720  FOR N=L TO 1 STEP -1
  173. 1730    LOCATE 7,(N+12) :PRINT " "
  174. 1740  NEXT N
  175. 1750    FOR M=1 TO L
  176. 1760     LOCATE 7,(M+11) :COLOR 11 :PRINT A$(M)
  177. 1770     LPRINT CHR$(27);CHR$(76);CHR$(N1);CHR$(N2);P$(M);NS$;
  178. 1780    NEXT M
  179. 1790  '
  180. 1800  '*****  set printer to 19/216 lines per inch every other line
  181. 1810  '
  182. 1820   IF (H MOD 2)=0 THEN LPRINT CHR$(27);CHR$(74);CHR$(19);
  183. 1830   LPRINT  "  "
  184. 1840   LOCATE 9,3  :COLOR 1  :PRINT "    PASS-"
  185. 1850   LOCATE 9,12 :COLOR 11 :PRINT H
  186. 1860   LOCATE 9,15 :COLOR 1  :PRINT " COMPLETE           "
  187. 1870  NEXT H
  188. 1880  '
  189. 1890  '*****  reset printer to default and print human readable text
  190. 1900  '
  191. 1910  LPRINT CHR$(27);"2",CHR$(27);"E"
  192. 1920  LPRINT S$;MSG$
  193. 1930 RETURN
  194. 1940  LOCATE 20,1 :COLOR 7,0,0 :PRINT
  195. 1950 END
  196. 1960  '
  197. 1970  '*****  enter data from console
  198. 1980  '
  199. 1990  LOCATE 7,3  :COLOR 6 :PRINT "ENTER MESSAGE:"
  200. 2000  LOCATE 7,17 :COLOR 10:INPUT " ",MSG$
  201. 2010  LOCATE 9,3  :COLOR 6 :PRINT " ENTER HEIGHT:"
  202. 2020  LOCATE 9,17 :COLOR 10:INPUT " ",HIGH
  203. 2030  RETURN
  204. 2040  '
  205. 2050  '*****  read data from file
  206. 2060  '
  207. 2070  LOCATE 9,3  :COLOR 6 :PRINT " ENTER HEIGHT:"
  208. 2080  LOCATE 9,17 :COLOR 10:INPUT " ",HIGH
  209. 2090  GOSUB 2260
  210. 2100  INPUT #1,MSG$
  211. 2110  GOSUB 790
  212. 2120  IF EOF(1) THEN CLOSE #1 :GOTO 450
  213. 2130  GOTO 2100
  214. 2140  '
  215. 2150  '*****  write data to file
  216. 2160  '
  217. 2170  LOCATE 7,3  :COLOR 6 :PRINT "ENTER MESSAGE (press enter to quit) "
  218. 2180  LOCATE 9,10 :COLOR 6 :PRINT "==> "
  219. 2190  LOCATE 9,14 :COLOR 10:INPUT " ",MSG$
  220. 2200  IF MSG$="" THEN CLOSE #1 :GOTO 450
  221. 2210  PRINT #1,MSG$ :GOSUB 2260
  222. 2220  GOTO 2170
  223. 2230  '
  224. 2240  '*****  clear data entry area
  225. 2250  '
  226. 2260  LOCATE 6,2  :PRINT "                                     "
  227. 2270  LOCATE 7,2  :PRINT "                                     "
  228. 2280  LOCATE 8,2  :PRINT "                                     "
  229. 2290  LOCATE 9,2  :PRINT "                                     "
  230. 2300  LOCATE 10,2 :PRINT "                                     "
  231. 2310  RETURN
  232. 2320 '
  233. 2330 '*****  CHECK FOR ONLY CAPITAL LETTERS
  234. 2340 ED$ = ""
  235. 2350 L = LEN(MSG$)
  236. 2360 FOR X = 1 TO L
  237. 2370 TEST$=MID$(MSG$,X,1)
  238. 2380 IF TEST$="a" THEN TEST$="A" : GOTO 2640
  239. 2390 IF TEST$="b" THEN TEST$="B" : GOTO 2640
  240. 2400 IF TEST$="c" THEN TEST$="C" : GOTO 2640
  241. 2410 IF TEST$="d" THEN TEST$="D" : GOTO 2640
  242. 2420 IF TEST$="e" THEN TEST$="E" : GOTO 2640
  243. 2430 IF TEST$="f" THEN TEST$="F" : GOTO 2640
  244. 2440 IF TEST$="g" THEN TEST$="G" : GOTO 2640
  245. 2450 IF TEST$="h" THEN TEST$="H" : GOTO 2640
  246. 2460 IF TEST$="i" THEN TEST$="I" : GOTO 2640
  247. 2470 IF TEST$="j" THEN TEST$="J" : GOTO 2640
  248. 2480 IF TEST$="k" THEN TEST$="K" : GOTO 2640
  249. 2490 IF TEST$="l" THEN TEST$="L" : GOTO 2640
  250. 2500 IF TEST$="m" THEN TEST$="M" : GOTO 2640
  251. 2510 IF TEST$="n" THEN TEST$="N" : GOTO 2640
  252. 2520 IF TEST$="o" THEN TEST$="O" : GOTO 2640
  253. 2530 IF TEST$="p" THEN TEST$="P" : GOTO 2640
  254. 2540 IF TEST$="q" THEN TEST$="Q" : GOTO 2640
  255. 2550 IF TEST$="r" THEN TEST$="R" : GOTO 2640
  256. 2560 IF TEST$="s" THEN TEST$="S" : GOTO 2640
  257. 2570 IF TEST$="t" THEN TEST$="T" : GOTO 2640
  258. 2580 IF TEST$="u" THEN TEST$="U" : GOTO 2640
  259. 2590 IF TEST$="v" THEN TEST$="V" : GOTO 2640
  260. 2600 IF TEST$="w" THEN TEST$="W" : GOTO 2640
  261. 2610 IF TEST$="x" THEN TEST$="X" : GOTO 2640
  262. 2620 IF TEST$="y" THEN TEST$="Y" : GOTO 2640
  263. 2630 IF TEST$="z" THEN TEST$="Z" : GOTO 2640
  264. 2640 ED$=ED$+TEST$
  265. 2650 NEXT X
  266. 2660 MSG$ = ED$
  267. 2670 RETURN
  268.